package com.java.tutorials.jdk7.copyonwritearraylist;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
/**
 * Created by xuzhike on 2016/1/21.
 */
public class CopyOnWriteArrayListTest {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
        startUpdatingThread(list);
        for (String element : list) {
            System.out.println("Element :" + element);
        }
        updatingThread.interrupt();

        List<String> lista = Collections.synchronizedList(new ArrayList<String>());
        startUpdatingThread(lista);
        synchronized (lista) {
            for (String element : lista) {
                System.out.println("Element :" + element);
            }
        }
        updatingThread.interrupt();
    }

    static Thread updatingThread;

    private static void startUpdatingThread(final List<String> list) {
        updatingThread = new Thread(new Runnable() {
            long counter = 0;

            public void run() {
                while (!Thread.interrupted()) {
                    int size = list.size();
                    Random random = new Random();
                    if (random.nextBoolean()) {
                        if (size > 1) {
                            list.remove(random.nextInt(size - 1));
                        }
                    } else {
                        if (size < 20) {
                            list.add("Random string " + counter);
                        }
                    }
                    counter++;
                }
            }

        });
        updatingThread.start();
    }
}
